# 你也不累，就是懒！
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.permissions import IsAdminUser
from django.utils import timezone

from users.models import User

# GET /meiduo_admin/statistical/day_active/
class UserDayActiveView(APIView):
    # 指定权限：只有管理员用户才能进行访问
    permission_classes = [IsAdminUser]

    def get(self, request):
        '''获取网站日活跃用户数'''
        # ① 查询数据库统计网站当日活跃用户数
        now_date = timezone.now().replace(hour=0, minute=0, second=0, microsecond=0)
        count = User.objects.filter(last_login__gte=now_date).count()

        # ② 但会相应数据
        response_data = {
            # 年-月-日
            'date': now_date.date(),
            'count': count
        }
        return Response(response_data)


# GET statistical/day_orders/
class UserDayOrdersView(APIView):
    # 指定权限：只有管理员用户才能进行访问
    permission_classes = [IsAdminUser]

    def get(self, request):
        '''获取网站日下单用户数'''
        # ① 查询数据库统计网站当日下单用户数
        now_date = timezone.now().replace(hour=0, minute=0, second=0, microsecond=0)
        count = User.objects.filter(orders__create_time__gte=now_date).distinct().count()

        # ② 返回响应数据
        response_data = {
            'date': now_date.date(),
            'count': count
        }

        return Response(response_data)



# GET /meiduo_admin/statistical/month_increment/
class UserMonthCountView(APIView):
    # 指定权限：只有管理员用户才能进入访问
    permission_classes = [IsAdminUser]
    def get(self, request):
        '''获取近30天网站的没人新增用户数'''
        # ① 查询数据库统计网站近30天网站的没人新增用户数
        # 结束时间
        now_date = timezone.now().replace(hour=0, minute=0, second=0, microsecond=0)
        # 起始时间：now_date -29天
        begin_date = now_date - timezone.timedelta(days=29)

        # 当前日期
        current_date = begin_date

        # 每日新增用户的数量
        month_li = []

        while current_date <= now_date:
            # 次日时间
            next_date = current_date + timezone.timedelta(days=1)
            # 统计当天的新增用户数量
            count = User.objects.filter(date_joined__gte=current_date,
                                        date_joined__lt=next_date).count()

            month_li.append({
                'count': count,
                'date': current_date.date()
            })
            current_date = next_date

        # ② 返回响应数据
        return Response(month_li)